View Issue Details

IDProjectCategoryView StatusLast Update
0001018K18X001.00 SKB SWANSW Issuepublic2021-12-22 11:09
Reporter(ALTech) Wooshin Kang Assigned To(ALTech) Wooshin Kang Due Date2020-11-13 16:43
PriorityhighSeveritys2-severeReproducibilityalways
Status closedResolutionfixed 
Summary0001018: [SWAN] Please check "vold " code for mount USB MEMORY,
DescriptionAs contents of my mail,
SPTEK request us to analysis source code for vold.

###########################################################################################
if (!(getMountFlags() & MountFlags::kVisible)) {

        ==========> why return at this point ? , Smart3 doesn't to return here and go to end of function. <======================
        // Not visible to apps, so no need to spin up FUSE
               LOG(DEBUG) << "Not visible to apps, so no need to spin up FUSE";
                     LOG(DEBUG) << "It always returns OK at this point. It cannot be processed after here.
                     
#if 1 //SPTEK: Added property for savelogfile service when connected USB device
        LOG(DEBUG) << "setting sys.usb.inserted as 1";
        property_set("sys.usb.inserted", "1");
#endif
        return OK;
    }
###########################################################################################
TagsNo tags attached.
Attach Tags

Relationships

related to 0001215 closed(HW) Sean Chiang [SWAN] usb memory stick is not detected. 

Users monitoring this issue

User List (SW) Bcan Yeh , (SW) Jerry Lin

Activities

(ALTech) Wooshin Kang

2020-11-10 16:06

developer  

PublicVolume_bfx-at100.cpp (13,024 bytes)   
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "PublicVolume.h"
#include "Utils.h"
#include "VolumeManager.h"
#include "fs/Exfat.h"
#include "fs/Ntfs.h"
#include "fs/Vfat.h"

#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <cutils/fs.h>
#include <private/android_filesystem_config.h>
#include <utils/Timers.h>

#include <fcntl.h>
#include <stdlib.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
#include <sys/wait.h>
#if 1 //SPTEK: Change USB mount point name to sdcard#
#include <dirent.h>
#endif
#if 1 //SPTEK: Added property for savelogfile service when connected USB device
#include "cutils/properties.h"
#endif

using android::base::StringPrintf;

namespace android {
namespace vold {

static const char* kFusePath = "/system/bin/sdcard";

static const char* kAsecPath = "/mnt/secure/asec";

PublicVolume::PublicVolume(dev_t device) : VolumeBase(Type::kPublic), mDevice(device), mFusePid(0) {
    setId(StringPrintf("public:%u,%u", major(device), minor(device)));
    mDevPath = StringPrintf("/dev/block/vold/%s", getId().c_str());
}

PublicVolume::~PublicVolume() {}

status_t PublicVolume::readMetadata() {
    status_t res = ReadMetadataUntrusted(mDevPath, &mFsType, &mFsUuid, &mFsLabel);

    auto listener = getListener();
    if (listener) listener->onVolumeMetadataChanged(getId(), mFsType, mFsUuid, mFsLabel);

    return res;
}

status_t PublicVolume::initAsecStage() {
    std::string legacyPath(mRawPath + "/android_secure");
    std::string securePath(mRawPath + "/.android_secure");

    // Recover legacy secure path
    if (!access(legacyPath.c_str(), R_OK | X_OK) && access(securePath.c_str(), R_OK | X_OK)) {
        if (rename(legacyPath.c_str(), securePath.c_str())) {
            PLOG(WARNING) << getId() << " failed to rename legacy ASEC dir";
        }
    }

    if (TEMP_FAILURE_RETRY(mkdir(securePath.c_str(), 0700))) {
        if (errno != EEXIST) {
            PLOG(WARNING) << getId() << " creating ASEC stage failed";
            return -errno;
        }
    }

    BindMount(securePath, kAsecPath);

    return OK;
}

status_t PublicVolume::doCreate() {
    return CreateDeviceNode(mDevPath, mDevice);
}

status_t PublicVolume::doDestroy() {
    return DestroyDeviceNode(mDevPath);
}

status_t PublicVolume::doMount() {
    readMetadata();

    if (mFsType == "vfat" && vfat::IsSupported()) {
        if (vfat::Check(mDevPath)) {
            LOG(ERROR) << getId() << " failed filesystem check";
            return -EIO;
        }
    } else if (mFsType == "exfat" && exfat::IsSupported()) {
        if (exfat::Check(mDevPath)) {
            LOG(ERROR) << getId() << " failed filesystem check";
            return -EIO;
        }
    } else if (mFsType == "ntfs" && ntfs::IsSupported()) {
        if (ntfs::Check(mDevPath)) {
            LOG(ERROR) << getId() << " failed filesystem check";
            return -EIO;
        }
    } else {
        LOG(ERROR) << getId() << " unsupported filesystem " << mFsType;
        return -EIO;
    }

    // Use UUID as stable name, if available
    std::string stableName = getId();
    if (!mFsUuid.empty()) {
        stableName = mFsUuid;
    }

#if 0 //SPTEK: Change USB mount point name to sdcard3
    stableName = "sdcard3"; 
#endif

#if 1 //SPTEK: Change USB mount point name to sdcard#
    //const std::string DEFAULT_MOUNT_NAME("/storage/sdcard");
    const std::string DEFAULT_MOUNT_NAME("/mnt/media_rw/sdcard");
    int nIndex=1;
    for(nIndex = 1 ; nIndex < 128 ; nIndex++)
    {
        DIR *pDir;
        std::string dir_name(StringPrintf("%s%d",DEFAULT_MOUNT_NAME.c_str(),nIndex));
        if((pDir = opendir(dir_name.c_str())) == NULL)
        {
            stableName = StringPrintf("sdcard%d", nIndex);
            break;
        }
        (void)closedir(pDir);
    }
#endif
#if 0 //SPTEK: Support NTFS and exFAT filesystem
    if(mFsType == "exfat" || mFsType == "ntfs") {
        std::string fsDevPath;
        if ( getDevFullPath(mDevice, fsDevPath) ) {
            mDevPath = fsDevPath;
        }
    }
#endif

    mRawPath = StringPrintf("/mnt/media_rw/%s", stableName.c_str());

    mFuseDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str());
    mFuseRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str());
    mFuseWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str());
    mFuseFull = StringPrintf("/mnt/runtime/full/%s", stableName.c_str());

    setInternalPath(mRawPath);
    if (getMountFlags() & MountFlags::kVisible) {
        setPath(StringPrintf("/storage/%s", stableName.c_str()));
    } else {
        setPath(mRawPath);
    }

    if (fs_prepare_dir(mRawPath.c_str(), 0700, AID_ROOT, AID_ROOT)) {
        PLOG(ERROR) << getId() << " failed to create mount points";
        return -errno;
    }

    if (mFsType == "vfat") {
        if (vfat::Mount(mDevPath, mRawPath, false, false, false, AID_MEDIA_RW, AID_MEDIA_RW, 0007,
                        true)) {
            PLOG(ERROR) << getId() << " failed to mount " << mDevPath;
            return -EIO;
        }
    } else if (mFsType == "exfat") {
        if (exfat::Mount(mDevPath, mRawPath, AID_MEDIA_RW, AID_MEDIA_RW, 0007)) {
            PLOG(ERROR) << getId() << " failed to mount " << mDevPath;
            return -EIO;
        }
    } else if (mFsType == "ntfs") {
        if (ntfs::Mount(mDevPath, mRawPath, false, false,
                            AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) {
            PLOG(ERROR) << getId() << " failed to mount " << mDevPath;
            return -EIO;
        }
    }

    if (getMountFlags() & MountFlags::kPrimary) {
        initAsecStage();
    }

    if (!(getMountFlags() & MountFlags::kVisible)) {
        // Not visible to apps, so no need to spin up FUSE
        return OK;
    }

    if (fs_prepare_dir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) ||
        fs_prepare_dir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) ||
        fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT) ||
        fs_prepare_dir(mFuseFull.c_str(), 0700, AID_ROOT, AID_ROOT)) {
        PLOG(ERROR) << getId() << " failed to create FUSE mount points";
        return -errno;
    }

    dev_t before = GetDevice(mFuseFull);

    if (!(mFusePid = fork())) {
        if (getMountFlags() & MountFlags::kPrimary) {
            // clang-format off
            if (execl(kFusePath, kFusePath,
                    "-u", "1023", // AID_MEDIA_RW
                    "-g", "1023", // AID_MEDIA_RW
                    "-U", std::to_string(getMountUserId()).c_str(),
                    "-w",
                    mRawPath.c_str(),
                    stableName.c_str(),
                    NULL)) {
                // clang-format on
                PLOG(ERROR) << "Failed to exec";
            }
        } else {
            // clang-format off
            if (execl(kFusePath, kFusePath,
                    "-u", "1023", // AID_MEDIA_RW
                    "-g", "1023", // AID_MEDIA_RW
                    "-U", std::to_string(getMountUserId()).c_str(),
                    mRawPath.c_str(),
                    stableName.c_str(),
                    NULL)) {
                // clang-format on
                PLOG(ERROR) << "Failed to exec";
            }
        }

        LOG(ERROR) << "FUSE exiting";
        _exit(1);
    }

    if (mFusePid == -1) {
        PLOG(ERROR) << getId() << " failed to fork";
        return -errno;
    }

    nsecs_t start = systemTime(SYSTEM_TIME_BOOTTIME);
    while (before == GetDevice(mFuseFull)) {
        LOG(DEBUG) << "Waiting for FUSE to spin up...";
        usleep(50000);  // 50ms

        nsecs_t now = systemTime(SYSTEM_TIME_BOOTTIME);
        if (nanoseconds_to_milliseconds(now - start) > 5000) {
            LOG(WARNING) << "Timed out while waiting for FUSE to spin up";
            return -ETIMEDOUT;
        }
    }
    /* sdcardfs will have exited already. FUSE will still be running */
    TEMP_FAILURE_RETRY(waitpid(mFusePid, nullptr, 0));
    mFusePid = 0;

#if 1 //SPTEK: Added property for savelogfile service when connected USB device
    property_set("sys.usb.inserted", "1");
#endif

    return OK;
}

status_t PublicVolume::doUnmount() {
    // Unmount the storage before we kill the FUSE process. If we kill
    // the FUSE process first, most file system operations will return
    // ENOTCONN until the unmount completes. This is an exotic and unusual
    // error code and might cause broken behaviour in applications.
#if 1 //SPTEK: Added property for savelogfile service when connected USB device
    if(android::vold::sSleepOnUnmount) {
        property_set("sys.usb.inserted", "0");
    }
#endif

    KillProcessesUsingPath(getPath());

    ForceUnmount(kAsecPath);

    ForceUnmount(mFuseDefault);
    ForceUnmount(mFuseRead);
    ForceUnmount(mFuseWrite);
    ForceUnmount(mFuseFull);
    ForceUnmount(mRawPath);

    rmdir(mFuseDefault.c_str());
    rmdir(mFuseRead.c_str());
    rmdir(mFuseWrite.c_str());
    rmdir(mFuseFull.c_str());
    rmdir(mRawPath.c_str());

    mFuseDefault.clear();
    mFuseRead.clear();
    mFuseWrite.clear();
    mFuseFull.clear();
    mRawPath.clear();

    return OK;
}

status_t PublicVolume::doFormat(const std::string& fsType) {
    bool useVfat = vfat::IsSupported();
    bool useExfat = exfat::IsSupported();
    bool useNtfs = ntfs::IsSupported();

    status_t res = OK;

    // Resolve the target filesystem type
    if (fsType == "auto" && useVfat && useExfat && useNtfs) {
        uint64_t size = 0;

        res = GetBlockDevSize(mDevPath, &size);
        if (res != OK) {
            LOG(ERROR) << "Couldn't get device size " << mDevPath;
            return res;
        }

        // If both vfat & exfat are supported use exfat for SDXC (>~32GiB) cards
        if (size > 32896LL * 1024 * 1024) {
            useVfat = false;
            useNtfs = false;
        } else {
            useExfat = false;
            useNtfs = false;
        }
    } else if (fsType == "vfat") {
        useExfat = false;
        useNtfs = false;
    } else if (fsType == "exfat") {
        useVfat = false;
        useNtfs = false;
    } else if (fsType == "ntfs") {
        useVfat = false;
        useExfat = false;
    }

    if (!useVfat && !useExfat && !useNtfs) {
        LOG(ERROR) << "Unsupported filesystem " << fsType;
        return -EINVAL;
    }

    if (WipeBlockDevice(mDevPath) != OK) {
        LOG(WARNING) << getId() << " " << fsType << " failed to wipe";
    }

    if (useVfat) {
        res = vfat::Format(mDevPath, 0);
    } else if (useExfat) {
        res = exfat::Format(mDevPath);
    } else if (useNtfs) {
        res = ntfs::Format(mDevPath);
    }

    if (res != OK) {
        LOG(ERROR) << getId() << " failed to format";
        res = -errno;
    }

    return res;
}
#if 1 //SPTEK: Support NTFS and exFAT filesystem
bool PublicVolume::getDevFullPath(dev_t device, std::string& fsDevPath)
{
    char buf[64], dev[64];
    char *value, *ptr;
    long major=0, minor=0;
    bool result = false;

    FILE *fd = fopen("/proc/partitions","r");
    //LOG(INFO) << "looking major:" << major(device) << ", minor: " << minor(device);
    if(fd)
    {
        while(fgets(buf,64,fd))
        {
            if(strlen(buf) <= 0)
            {
                continue;
            }
            value = strtok(buf, " "); if(value == NULL) continue;
            major = strtol(value,&ptr,10);

            value = strtok(NULL, " ");  if(value == NULL) continue;
            minor = strtol(value,&ptr,10);

            value = strtok(NULL, " ");  if(value == NULL) continue;

            value = strtok(NULL, " ");  if(value == NULL) continue;
            strncpy(dev, value, strlen(value));

            ptr = dev;
            while(*ptr != '\0') {
                if(*ptr == '\n' || *ptr == '\r')
                {
                    *ptr = '\0';
                    break;
                }
                ptr++;
            }

            //LOG(INFO) << "major: " << major << ", minor: " << minor << ", dev: " << dev;
            if( (major == (long)major(device)) && (minor == (long)minor(device)) )
            {
                fsDevPath = StringPrintf("/dev/block/%s",dev);
                result = true;
                break;
            }
        }
        fclose(fd);
    }

    return result;
}
#endif

}  // namespace vold
}  // namespace android
PublicVolume_bfx-at100.cpp (13,024 bytes)   
PublicVolume_bfx-ua300.cpp (13,530 bytes)   
/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "PublicVolume.h"
#include "Utils.h"
#include "VolumeManager.h"
#include "fs/Exfat.h"
#include "fs/Ntfs.h"
#include "fs/Vfat.h"

#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android-base/stringprintf.h>
#include <cutils/fs.h>
#include <private/android_filesystem_config.h>
#include <utils/Timers.h>

#include <fcntl.h>
#include <stdlib.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <sys/types.h>
#include <sys/wait.h>
#if 1 //SPTEK: Change USB mount point name to sdcard#
#include <dirent.h>
#endif
#if 1 //SPTEK: Added property for savelogfile service when connected USB device
#include "cutils/properties.h"
#endif

using android::base::GetBoolProperty;
using android::base::StringPrintf;

namespace android {
namespace vold {

static const char* kFusePath = "/system/bin/sdcard";

static const char* kAsecPath = "/mnt/secure/asec";

PublicVolume::PublicVolume(dev_t device) : VolumeBase(Type::kPublic), mDevice(device), mFusePid(0) {
    setId(StringPrintf("public:%u,%u", major(device), minor(device)));
    mDevPath = StringPrintf("/dev/block/vold/%s", getId().c_str());
}

PublicVolume::~PublicVolume() {}

status_t PublicVolume::readMetadata() {
    status_t res = ReadMetadataUntrusted(mDevPath, &mFsType, &mFsUuid, &mFsLabel);

    auto listener = getListener();
    if (listener) listener->onVolumeMetadataChanged(getId(), mFsType, mFsUuid, mFsLabel);

    return res;
}

status_t PublicVolume::initAsecStage() {
    std::string legacyPath(mRawPath + "/android_secure");
    std::string securePath(mRawPath + "/.android_secure");

    // Recover legacy secure path
    if (!access(legacyPath.c_str(), R_OK | X_OK) && access(securePath.c_str(), R_OK | X_OK)) {
        if (rename(legacyPath.c_str(), securePath.c_str())) {
            PLOG(WARNING) << getId() << " failed to rename legacy ASEC dir";
        }
    }

    if (TEMP_FAILURE_RETRY(mkdir(securePath.c_str(), 0700))) {
        if (errno != EEXIST) {
            PLOG(WARNING) << getId() << " creating ASEC stage failed";
            return -errno;
        }
    }

    BindMount(securePath, kAsecPath);

    return OK;
}

status_t PublicVolume::doCreate() {
    return CreateDeviceNode(mDevPath, mDevice);
}

status_t PublicVolume::doDestroy() {
    return DestroyDeviceNode(mDevPath);
}

status_t PublicVolume::doMount() {
    readMetadata();

    if (mFsType == "vfat" && vfat::IsSupported()) {
        if (vfat::Check(mDevPath)) {
            LOG(ERROR) << getId() << " failed filesystem check";
            return -EIO;
        }
    } else if (mFsType == "exfat" && exfat::IsSupported()) {
        if (exfat::Check(mDevPath)) {
            LOG(ERROR) << getId() << " failed filesystem check";
            return -EIO;
        }
    } else if (mFsType == "ntfs" && ntfs::IsSupported()) {
        if (ntfs::Check(mDevPath)) {
            LOG(ERROR) << getId() << " failed filesystem check";
            return -EIO;
        }
    } else {
        LOG(ERROR) << getId() << " unsupported filesystem " << mFsType;
        return -EIO;
    }

    // Use UUID as stable name, if available
    std::string stableName = getId();
    if (!mFsUuid.empty()) {
        stableName = mFsUuid;
    }

#if 0 //SPTEK: Change USB mount point name to sdcard3
    stableName = "sdcard3"; 
#endif

#if 1 //SPTEK: Change USB mount point name to sdcard#
    //const std::string DEFAULT_MOUNT_NAME("/storage/sdcard");
    const std::string DEFAULT_MOUNT_NAME("/mnt/media_rw/sdcard");
    int nIndex=1;
    for(nIndex = 1 ; nIndex < 128 ; nIndex++)
    {
        DIR *pDir;
        std::string dir_name(StringPrintf("%s%d",DEFAULT_MOUNT_NAME.c_str(),nIndex));
        if((pDir = opendir(dir_name.c_str())) == NULL)
        {
            stableName = StringPrintf("sdcard%d", nIndex);
            break;
        }
        (void)closedir(pDir);
    }
#endif
#if 0 //SPTEK: Support NTFS and exFAT filesystem
    if(mFsType == "exfat" || mFsType == "ntfs") {
        std::string fsDevPath;
        if ( getDevFullPath(mDevice, fsDevPath) ) {
            mDevPath = fsDevPath;
        }
    }
#endif

    mRawPath = StringPrintf("/mnt/media_rw/%s", stableName.c_str());

    mFuseDefault = StringPrintf("/mnt/runtime/default/%s", stableName.c_str());
    mFuseRead = StringPrintf("/mnt/runtime/read/%s", stableName.c_str());
    mFuseWrite = StringPrintf("/mnt/runtime/write/%s", stableName.c_str());
    mFuseFull = StringPrintf("/mnt/runtime/full/%s", stableName.c_str());

    setInternalPath(mRawPath);
    if (getMountFlags() & MountFlags::kVisible) {
        setPath(StringPrintf("/storage/%s", stableName.c_str()));
    } else {
        setPath(mRawPath);
    }

    if (fs_prepare_dir(mRawPath.c_str(), 0700, AID_ROOT, AID_ROOT)) {
        PLOG(ERROR) << getId() << " failed to create mount points";
        return -errno;
    }

    if (mFsType == "vfat") {
        if (vfat::Mount(mDevPath, mRawPath, false, false, false, AID_MEDIA_RW, AID_MEDIA_RW, 0007,
                        true)) {
            PLOG(ERROR) << getId() << " failed to mount " << mDevPath;
            return -EIO;
        }
    } else if (mFsType == "exfat") {
        if (exfat::Mount(mDevPath, mRawPath, AID_MEDIA_RW, AID_MEDIA_RW, 0007)) {
            PLOG(ERROR) << getId() << " failed to mount " << mDevPath;
            return -EIO;
        }
    } else if (mFsType == "ntfs") {
        if (ntfs::Mount(mDevPath, mRawPath, false, false,
                            AID_MEDIA_RW, AID_MEDIA_RW, 0007, true)) {
            PLOG(ERROR) << getId() << " failed to mount " << mDevPath;
            return -EIO;
        }
    }

    if (getMountFlags() & MountFlags::kPrimary) {
        initAsecStage();
    }
    if (!(getMountFlags() & MountFlags::kVisible)) {
        // Not visible to apps, so no need to spin up FUSE
	    LOG(DEBUG) << "Not visible to apps, so no need to spin up FUSE";
		LOG(DEBUG) << "It always returns OK at this point. It cannot be processed after here. 
		
#if 1 //SPTEK: Added property for savelogfile service when connected USB device
        LOG(DEBUG) << "setting sys.usb.inserted as 1";
        property_set("sys.usb.inserted", "1");
#endif

        return OK;
    }

    if (fs_prepare_dir(mFuseDefault.c_str(), 0700, AID_ROOT, AID_ROOT) ||
        fs_prepare_dir(mFuseRead.c_str(), 0700, AID_ROOT, AID_ROOT) ||
        fs_prepare_dir(mFuseWrite.c_str(), 0700, AID_ROOT, AID_ROOT) ||
        fs_prepare_dir(mFuseFull.c_str(), 0700, AID_ROOT, AID_ROOT)) {
        PLOG(ERROR) << getId() << " failed to create FUSE mount points";
	    LOG(DEBUG) << getId() << " failed to create FUSE mount points";
        return -errno;
    }

    dev_t before = GetDevice(mFuseFull);
    if (!(mFusePid = fork())) {
        if (getMountFlags() & MountFlags::kPrimary) {
            // clang-format off
            if (execl(kFusePath, kFusePath,
                    "-u", "1023", // AID_MEDIA_RW
                    "-g", "1023", // AID_MEDIA_RW
                    "-U", std::to_string(getMountUserId()).c_str(),
                    "-w",
                    mRawPath.c_str(),
                    stableName.c_str(),
                    NULL)) {
                // clang-format on
		     PLOG(ERROR) << "Failed to exec";
            }
        } else {
            // clang-format off
            if (execl(kFusePath, kFusePath,
                    "-u", "1023", // AID_MEDIA_RW
                    "-g", "1023", // AID_MEDIA_RW
                    "-U", std::to_string(getMountUserId()).c_str(),
                    mRawPath.c_str(),
                    stableName.c_str(),
                    NULL)) {
                // clang-format on
                PLOG(ERROR) << "Failed to exec";
            }
        }

        LOG(ERROR) << "FUSE exiting";
        _exit(1);
    }
    if (mFusePid == -1) {
        PLOG(ERROR) << getId() << " failed to fork";
        return -errno;
    }

    nsecs_t start = systemTime(SYSTEM_TIME_BOOTTIME);
    while (before == GetDevice(mFuseFull)) {
        LOG(DEBUG) << "Waiting for FUSE to spin up...";
        usleep(50000);  // 50ms

        nsecs_t now = systemTime(SYSTEM_TIME_BOOTTIME);
        if (nanoseconds_to_milliseconds(now - start) > 5000) {
            LOG(WARNING) << "Timed out while waiting for FUSE to spin up";
            return -ETIMEDOUT;
        }
    }
    /* sdcardfs will have exited already. FUSE will still be running */
    TEMP_FAILURE_RETRY(waitpid(mFusePid, nullptr, 0));
    mFusePid = 0;

#if 1 //SPTEK: Added property for savelogfile service when connected USB device
        LOG(DEBUG) << "setting sys.usb.inserted as 1";
        property_set("sys.usb.inserted", "1");
#endif

    return OK;
}

status_t PublicVolume::doUnmount() {
    // Unmount the storage before we kill the FUSE process. If we kill
    // the FUSE process first, most file system operations will return
    // ENOTCONN until the unmount completes. This is an exotic and unusual
    // error code and might cause broken behaviour in applications.
#if 1 //SPTEK: Added property for savelogfile service when connected USB device
    if(android::vold::sSleepOnUnmount) {
        property_set("sys.usb.inserted", "0");
    }
#endif

    KillProcessesUsingPath(getPath());

    ForceUnmount(kAsecPath);

    ForceUnmount(mFuseDefault);
    ForceUnmount(mFuseRead);
    ForceUnmount(mFuseWrite);
    ForceUnmount(mFuseFull);
    ForceUnmount(mRawPath);

    rmdir(mFuseDefault.c_str());
    rmdir(mFuseRead.c_str());
    rmdir(mFuseWrite.c_str());
    rmdir(mFuseFull.c_str());
    rmdir(mRawPath.c_str());

    mFuseDefault.clear();
    mFuseRead.clear();
    mFuseWrite.clear();
    mFuseFull.clear();
    mRawPath.clear();

    return OK;
}

status_t PublicVolume::doFormat(const std::string& fsType) {
    bool useVfat = vfat::IsSupported();
    bool useExfat = exfat::IsSupported();
    bool useNtfs = ntfs::IsSupported();

    status_t res = OK;

    // Resolve the target filesystem type
    if (fsType == "auto" && useVfat && useExfat && useNtfs) {
        uint64_t size = 0;

        res = GetBlockDevSize(mDevPath, &size);
        if (res != OK) {
            LOG(ERROR) << "Couldn't get device size " << mDevPath;
            return res;
        }

        // If both vfat & exfat are supported use exfat for SDXC (>~32GiB) cards
        if (size > 32896LL * 1024 * 1024) {
            useVfat = false;
            useNtfs = false;
        } else {
            useExfat = false;
            useNtfs = false;
        }
    } else if (fsType == "vfat") {
        useExfat = false;
        useNtfs = false;
    } else if (fsType == "exfat") {
        useVfat = false;
        useNtfs = false;
    } else if (fsType == "ntfs") {
        useVfat = false;
        useExfat = false;
    }

    if (!useVfat && !useExfat && !useNtfs) {
        LOG(ERROR) << "Unsupported filesystem " << fsType;
        return -EINVAL;
    }

    if (WipeBlockDevice(mDevPath) != OK) {
        LOG(WARNING) << getId() << " " << fsType << " failed to wipe";
    }

    if (useVfat) {
        res = vfat::Format(mDevPath, 0);
    } else if (useExfat) {
        res = exfat::Format(mDevPath);
    } else if (useNtfs) {
        res = ntfs::Format(mDevPath);
    }

    if (res != OK) {
        LOG(ERROR) << getId() << " failed to format";
        res = -errno;
    }

    return res;
}
#if 1 //SPTEK: Support NTFS and exFAT filesystem
bool PublicVolume::getDevFullPath(dev_t device, std::string& fsDevPath)
{
    char buf[64], dev[64];
    char *value, *ptr;
    long major=0, minor=0;
    bool result = false;

    FILE *fd = fopen("/proc/partitions","r");
    //LOG(INFO) << "looking major:" << major(device) << ", minor: " << minor(device);
    if(fd)
    {
        while(fgets(buf,64,fd))
        {
            if(strlen(buf) <= 0)
            {
                continue;
            }
            value = strtok(buf, " "); if(value == NULL) continue;
            major = strtol(value,&ptr,10);

            value = strtok(NULL, " ");  if(value == NULL) continue;
            minor = strtol(value,&ptr,10);

            value = strtok(NULL, " ");  if(value == NULL) continue;

            value = strtok(NULL, " ");  if(value == NULL) continue;
            strncpy(dev, value, strlen(value));

            ptr = dev;
            while(*ptr != '\0') {
                if(*ptr == '\n' || *ptr == '\r')
                {
                    *ptr = '\0';
                    break;
                }
                ptr++;
            }

            //LOG(INFO) << "major: " << major << ", minor: " << minor << ", dev: " << dev;
            if( (major == (long)major(device)) && (minor == (long)minor(device)) )
            {
                fsDevPath = StringPrintf("/dev/block/%s",dev);
                result = true;
                break;
            }
        }
        fclose(fd);
    }

    return result;
}
#endif

}  // namespace vold
}  // namespace android
PublicVolume_bfx-ua300.cpp (13,530 bytes)   

(SW) Jacky Chiang

2020-11-10 20:11

manager   ~0004929

Last edited: 2020-11-10 20:16

Hi Wooshin,
Is there no any log to be saved in USB memory disk ?
Which USB port is plugged in USB memory disk ?

(ALTech) Wooshin Kang

2020-11-11 08:53

developer   ~0004930

Last edited: 2020-11-11 08:59

Dear jacky,

yes, there is no log message.
I use usb3.0 port for test.


I will explain using "PublicVolume_bfx-ua300.cpp". if property "Sys.usb.inserted is 1, system save logcat log to usb memory stick.
"Sys.usb.inserted" is not set because it is returned from line 211 after entering this function. So, there was a problem that the log was not saved in the usb, and line 208 was added for debugging. However, since the eagle model goes down to line 280, sys.usb.inserted is set without adding line 208.
So sptek is wondering why in the swan project, unlike the eagle, the domount() function returns at line 211.

(SW) Jacky Chiang

2020-11-16 13:45

manager   ~0005001

Hi Jerry,

   Please help to check if saving files to USB is working or not in current build.

(SW) Jacky Chiang

2021-01-06 19:50

manager   ~0005737

Hi Bcan,

    Per meeting this morning, please also trace this mount issue when you are developing ATT daemon.

(SW) Bcan Yeh

2021-02-02 18:41

developer   ~0006010

Hi Wooshin,

There is a problem in USB 3.0 detecting. I think it's the root cause for no log saved.
Please check this in synaptics jira (SKBBALT-113).

(ALTech) Wooshin Kang

2021-02-02 22:08

developer   ~0006019

Hi Bcan,

I will monitor it.

Thanks

(ALTech) Wooshin Kang

2021-02-10 09:22

developer   ~0006074

Hi Bcan,

Do you have any updates..?

Thanks.

(ALTech) Wooshin Kang

2021-02-10 09:25

developer   ~0006075

Hi Bcan,

Do you have any updates..?

Thanks.

(SW) Bcan Yeh

2021-02-17 09:17

developer   ~0006085

Hi Wooshin,

    Please check this in synaptics jira (SKBBALT-113).

(SW) Bcan Yeh

2021-12-22 11:09

developer   ~0008993

Close this issued and discuss in 0001215

Issue History

Date Modified Username Field Change
2020-11-10 16:06 (ALTech) Wooshin Kang New Issue
2020-11-10 16:06 (ALTech) Wooshin Kang Status new => assigned
2020-11-10 16:06 (ALTech) Wooshin Kang Assigned To => (SW) Jacky Chiang
2020-11-10 16:06 (ALTech) Wooshin Kang File Added: PublicVolume_bfx-at100.cpp
2020-11-10 16:06 (ALTech) Wooshin Kang File Added: PublicVolume_bfx-ua300.cpp
2020-11-10 20:11 (SW) Jacky Chiang Note Added: 0004929
2020-11-10 20:13 (SW) Jacky Chiang Note Edited: 0004929
2020-11-10 20:16 (SW) Jacky Chiang Note Edited: 0004929
2020-11-11 08:53 (ALTech) Wooshin Kang Note Added: 0004930
2020-11-11 08:59 (ALTech) Wooshin Kang Note Edited: 0004930
2020-11-13 11:07 (SW) Jacky Chiang Project T99X171.00 SKB Eagle => K18X001.00 SKB SWAN
2020-11-16 13:45 (SW) Jacky Chiang Note Added: 0005001
2020-11-16 13:45 (SW) Jacky Chiang Issue Monitored: (SW) Jerry Lin
2020-12-21 09:38 (SW) Jacky Chiang Category SW => SW Issue
2020-12-21 09:38 (SW) Jacky Chiang Description Updated
2021-01-06 11:29 (SW) Jacky Chiang Issue Monitored: (SW) Bcan Yeh
2021-01-06 19:48 (SW) Jacky Chiang Assigned To (SW) Jacky Chiang => (SW) Bcan Yeh
2021-01-06 19:50 (SW) Jacky Chiang Note Added: 0005737
2021-02-02 18:41 (SW) Bcan Yeh Note Added: 0006010
2021-02-02 18:42 (SW) Bcan Yeh Assigned To (SW) Bcan Yeh => (ALTech) Wooshin Kang
2021-02-02 22:08 (ALTech) Wooshin Kang Note Added: 0006019
2021-02-10 09:22 (ALTech) Wooshin Kang Note Added: 0006074
2021-02-10 09:25 (ALTech) Wooshin Kang Note Added: 0006075
2021-02-17 09:17 (SW) Bcan Yeh Note Added: 0006085
2021-12-22 11:07 (SW) Bcan Yeh Relationship added related to 0001215
2021-12-22 11:09 (SW) Bcan Yeh Status assigned => closed
2021-12-22 11:09 (SW) Bcan Yeh Resolution open => fixed
2021-12-22 11:09 (SW) Bcan Yeh Note Added: 0008993